package dao;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import business.Pari;


public class DaoPari {
	/* ------------------------------------------------ REQUETES PRECOMPILEES */
	private static CallableStatement statementGetPari = null;
	private static CallableStatement statementGetParis = null;
	private static CallableStatement statementAjouterPari = null;


	/* --------------------------------------------------------- CONSTRUCTEUR */
	static {
		try {
			statementGetPari = DbConnection.getInstance().prepareCall("{call getPari(?)}");
			statementGetParis = DbConnection.getInstance().prepareCall("{call getParis(?)}");
			statementAjouterPari = DbConnection.getInstance().prepareCall("{call ajouterPari(?, ?, ?, ?, ?, ?)}");
		}
		catch(SQLException e) {
			e.printStackTrace();
		}
	}


	/* -------------------------------------------------------------- METHODE */
	public static Pari getPari(int id_pari) {
		Pari pari = null;
		
		try {
			ResultSet rs = null;
			
			synchronized(statementGetPari) {
				statementGetPari.setInt(1, id_pari);
				
				rs = statementGetPari.executeQuery();
			}
			
			if(rs != null && rs.last()) {
				if(rs.getRow() == 1) {
					pari = new Pari(
							rs.getInt("id_pari"),
							rs.getInt("fk_id_utilisateur"),
							rs.getInt("fk_id_passageTrainTheorique"),
							rs.getInt("mise"),
							rs.getInt("retard"),
							rs.getTimestamp("heurePari"),
							rs.getInt("gainPossible"),
							rs.getInt("etat"));
				}
				else {
					System.err.println("DaoPari.getPari(" + id_pari + ") : plusieurs résultats.");
				}
			}
			else {
				System.err.println("DaoPari.getPari(" + id_pari + ") : aucun résultat.");
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return null;
		}
		
		return pari;
	}
	

	public static List<Pari> getParis(int id_utilisateur) {
		List<Pari> paris = null;
		
		try {
			ResultSet rs = null;
			
			synchronized(statementGetParis) {
				statementGetParis.setInt(1, id_utilisateur);
				
				rs = statementGetParis.executeQuery();
			}
			
			paris = new ArrayList<Pari>();
			
			while(rs.next()) {
				paris.add(new Pari(
						rs.getInt("id_pari"),
						rs.getInt("fk_id_utilisateur"),
						rs.getInt("fk_id_passageTrainTheorique"),
						rs.getInt("mise"),
						rs.getInt("retard"),
						rs.getTimestamp("heurePari"),
						rs.getInt("gainPossible"),
						rs.getInt("etat")));
			}
		}
		catch (SQLException e) {
			e.printStackTrace();
			
			return null;
		}
		
		return paris;
	}
	

	public static boolean ajouterPari(int id_utilisateur, int fk_id_passageTrainTheorique, int mise, int retard) {
		try {
			Date heurePari = new Date(); //TODO voir pour récupérer l'heure actuelle depuis les serveurs de la SNCF
			Date arriveeTheorique = DaoPassageTrainTheorique.getPassageTrainTheorique(fk_id_passageTrainTheorique).getArriveeTheorique();
			long msPassageTrain = arriveeTheorique.getTime();
			int minAvantPassage = (int) (msPassageTrain - heurePari.getTime()) / (60000);
			double coefficient = (1.0 + (((double) retard)/3.0)) * (1.0 + (((double) Math.max(0.0, (minAvantPassage-10.0)))/50.0));
			int gainPossible = (int) (mise * coefficient);
			
			synchronized(statementAjouterPari) {
				statementAjouterPari.setInt(1, id_utilisateur);
				statementAjouterPari.setInt(2, fk_id_passageTrainTheorique);
				statementAjouterPari.setInt(3, mise);
				statementAjouterPari.setInt(4, retard);
				statementAjouterPari.setTimestamp(5, new java.sql.Timestamp(heurePari.getTime()));
				statementAjouterPari.setInt(6, gainPossible);
				
				statementAjouterPari.execute();
			}
		}
		catch(SQLException e) {
			e.printStackTrace();
			
			return false;
		}
		
		return true;
	}
}
